home *** CD-ROM | disk | FTP | other *** search
- ; FRPOLY
-
- (defvar *v*)
- (defvar *X*)
- (defvar *alpha*)
- (defvar *A*)
- (defvar *B*)
- (defvar *B*)
- (defvar *l)
- (defvar *p)
- (defvar q*)
- (defvar u*)
- (defvar *var)
- (defvar *y*)
- (defvar *R*)
- (defvar *r2*)
- (defvar *r3*)
-
- ;(declare (localf pcoefadd pcplus pcplus1 pplus ptimes ptimes1
- ; ptimes2 ptimes3 psimp pctimes pctimes1
- ; pplus1))
-
- (defmacro pointergp (x y) `(> (get ,x 'order)(get ,y 'order)))
- (defmacro pcoefp (e) `(atom ,e))
-
- (defmacro pzerop (x) `(and (numberp ,x) (zerop ,x))) ;true for 0 or 0.0
- ;(defmacro pzero () 0)
- (defmacro cplus (x y) `(+ ,x ,y))
- (defmacro ctimes (x y) `(* ,x ,y))
-
- (defun pcoefadd (e c x)
- (if (pzerop c)
- x
- (cons e (cons c x))))
-
- (defun pcplus (c p)
- (if (pcoefp p)
- (cplus p c)
- (psimp (car p) (pcplus1 c (cdr p)))))
-
- (defun pcplus1 (c x)
- (cond ((null x)
- (cond ((pzerop c) nil) (t (cons 0 (cons c nil)))))
- ((pzerop (car x)) (pcoefadd 0 (pplus c (cadr x)) nil))
- (t (cons (car x) (cons (cadr x) (pcplus1 c (cddr x)))))))
-
- (defun pctimes (c p) (cond ((pcoefp p) (ctimes c p))
- (t (psimp (car p) (pctimes1 c (cdr p))))))
-
- (defun pctimes1 (c x)
- (cond ((null x) nil)
- (t (pcoefadd (car x)
- (ptimes c (cadr x))
- (pctimes1 c (cddr x))))))
-
- (defun pplus (x y) (cond ((pcoefp x) (pcplus x y))
- ((pcoefp y) (pcplus y x))
- ((eq (car x) (car y))
- (psimp (car x) (pplus1 (cdr y) (cdr x))))
- ((pointergp (car x) (car y))
- (psimp (car x) (pcplus1 y (cdr x))))
- (t (psimp (car y) (pcplus1 x (cdr y))))))
-
- (defun pplus1 (x y)
- (cond ((null x) y)
- ((null y) x)
- ((= (car x) (car y))
- (pcoefadd (car x)
- (pplus (cadr x) (cadr y))
- (pplus1 (cddr x) (cddr y))))
- ((> (car x) (car y))
- (cons (car x) (cons (cadr x) (pplus1 (cddr x) y))))
- (t (cons (car y) (cons (cadr y) (pplus1 x (cddr y)))))))
-
- (defun psimp (var x)
- (cond ((null x) 0)
- ((atom x) x)
- ((zerop (car x)) (cadr x))
- (t (cons var x))))
-
- (defun ptimes (x y) (cond ((or (pzerop x) (pzerop y)) 0)
- ((pcoefp x) (pctimes x y))
- ((pcoefp y) (pctimes y x))
- ((eq (car x) (car y))
- (psimp (car x) (ptimes1 (cdr x) (cdr y))))
- ((pointergp (car x) (car y))
- (psimp (car x) (pctimes1 y (cdr x))))
- (t (psimp (car y) (pctimes1 x (cdr y))))))
-
- (defun ptimes1 (*x* y) (prog (u* *v*)
- (setq *v* (setq u* (ptimes2 y)))
- a (setq *x* (cddr *x*))
- (cond ((null *x*) (return u*)))
- (ptimes3 y)
- (go a)))
-
- (defun ptimes2 (y) (cond ((null y) nil)
- (t (pcoefadd (+ (car *x*) (car y))
- (ptimes (cadr *x*) (cadr y))
- (ptimes2 (cddr y))))))
-
- (defun ptimes3 (y)
- (prog (e u c)
- a1 (cond ((null y) (return nil)))
- (setq e (+ (car *x*) (car y)))
- (setq c (ptimes (cadr y) (cadr *x*) ))
- (cond ((pzerop c) (setq y (cddr y)) (go a1))
- ((or (null *v*) (> e (car *v*)))
- (setq u* (setq *v* (pplus1 u* (list e c))))
- (setq y (cddr y)) (go a1))
- ((= e (car *v*))
- (setq c (pplus c (cadr *v*)))
- (cond ((pzerop c) (setq u* (setq *v* (pdiffer1 u* (list (car *v*) (cadr *v*))))))
- (t (rplaca (cdr *v*) c)))
- (setq y (cddr y))
- (go a1)))
- a (cond ((and (cddr *v*) (> (caddr *v*) e)) (setq *v* (cddr *v*)) (go a)))
- (setq u (cdr *v*))
- b (cond ((or (null (cdr u)) (< (cadr u) e))
- (rplacd u (cons e (cons c (cdr u)))) (go e)))
- (cond ((pzerop (setq c (pplus (caddr u) c))) (rplacd u (cdddr u)) (go d))
- (t (rplaca (cddr u) c)))
- e (setq u (cddr u))
- d (setq y (cddr y))
- (cond ((null y) (return nil)))
- (setq e (+ (car *x*) (car y)))
- (Setq c (ptimes (cadr y) (cadr *x*)))
- c (cond ((and (cdr u) (> (cadr u) e)) (setq u (cddr u)) (go c)))
- (go b)))
-
- ;; pdiffer1 is referred to above but not defined. RPG says it is never called.
- (defun pdiffer1 (x y) x y (error "pdiffer2 called"))
-
- (defun pexptsq (p n)
- (do ((n (floor n 2) (floor n 2))
- (s (cond ((oddp n) p) (t 1))))
- ((zerop n) s)
- (setq p (ptimes p p))
- (and (oddp n) (setq s (ptimes s p))) ))
-
- (defun setup-frpoly nil
- (setf (get 'x 'order ) 1)
- (setf (get 'y 'order ) 2)
- (setf (get 'z 'order ) 3)
- (setq *r* (pplus '(x 1 1 0 1) (pplus '(y 1 1) '(z 1 1)))) ; r= x+y+z+1
- (setq *r2* (ptimes *r* 100000)) ;r2 = 100000*r
- (setq *r3* (ptimes *r* 1.0)); r3 = r with floating point coefficients
- )
-
- (setup-frpoly)
-
- (define-timer frpoly2r "FRPoly, Power = 2, r = x + y + z + 1" (pexptsq *r* 2))
- (define-timer frpoly2r2 "FRPoly, Power = 2, r2 = 1000r" (pexptsq *r2* 2))
- (define-timer frpoly2r3 "FRPoly, Power = 2, r3 = r in flonums" (pexptsq *r3* 2))
-
- (qa-attempt "FRPoly, Power = 2, r = x + y + z + 1" (pexptsq *r* 2)
- (Z 2 1 1 (Y 1 2 0 (X 1 2 0 2)) 0 (Y 2 1 1 (X 1 2 0 2) 0 (X 2 1 1 3 0 1))))
-
-
- (qa-attempt "FRPoly, Power = 2, r3 = r in flonums" (pexptsq *r3* 2)
- (Z 2 1.0 1 (Y 1 2.0 0 (X 1 2.0 0 2.0)) 0
- (Y 2 1.0 1 (X 1 2.0 0 2.0) 0 (X 2 1.0 1 3.0 0 1.0))))
-
- (define-timer frpoly5r "FRPoly, Power = 5, r = x + y + z + 1" (pexptsq *r* 5))
- (define-timer frpoly5r2 "FRPoly, Power = 5, r2 = 1000r" (pexptsq *r2* 5))
- (define-timer frpoly5r3 "FRPoly, Power = 5, r3 = r in flonums" (pexptsq *r3* 5))
-
- (define-timer frpoly10r "FRPoly, Power = 10, r = x + y + z + 1" (pexptsq *r* 10))
- (define-timer frpoly10r2 "FRPoly, Power = 10, r2 = 1000r" (pexptsq *r2* 10))
- (define-timer frpoly10r3 "FRPoly, Power = 10, r3 = r in flonums" (pexptsq *r3* 10))
-
- (define-timer frpoly15r "FRPoly, Power = 15, r = x + y + z + 1" (pexptsq *r* 15))
- (define-timer frpoly15r2 "FRPoly, Power = 15, r2 = 1000r" (pexptsq *r2* 15))
- (define-timer frpoly15r3 "FRPoly, Power = 15, r3 = r in flonums" (pexptsq *r3* 15))